<?php
/**
 *  MyApp_ClassFactory.php
 *
 *  @author     Masaki Fujimoto <fujimoto@php.net>
 *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
 *  @package    Ethna
 *  @version    $Id: Ethna_ClassFactory.php 527 2008-05-07 02:40:15Z mumumu-org $
 */

// {{{ MyApp_ClassFactory
/**
 *  Ethnaフレームワークのオブジェクト生成ゲートウェイ
 *
 *  DIコンテナか、ということも考えましたがEthnaではこの程度の単純なものに
 *  留めておきます。アプリケーションレベルDIしたい場合はフィルタチェインを
 *  使って実現することも出来ます。
 *
 *  @author     Masaki Fujimoto <fujimoto@php.net>
 *  @access     public
 *  @package    Ethna
 */
 require_once 'MyApp_ManagerCache.php';
class MyApp_ClassFactory extends Ethna_ClassFactory
{
    
    /**
     *  typeに対応するアプリケーションマネージャオブジェクトを返す
     *
     *  @access public
     *  @param  string  $type   クラスキー
     *  @param  bool    $weak   オブジェクトが未生成の場合の強制生成フラグ(default: false)
     *  @return object  Ethna_AppManager    マネージャオブジェクト
     *
     *  TODO: 現状の実装では、typeを名前として扱っているのに、
     *        大文字小文字を区別して違うインスタンスを返しているのを修正する
     */
    function &getManager($type, $weak = false)
    {
        $obj = parent::getManager($type, $weak);
        
        $obj_class_name = $this->controller->getObjectClassName($type);
        $cache_class_name = $obj_class_name.'Cache';
        if (class_exists($cache_class_name) === false
            && $this->_include($cache_class_name) === false) {
            return $obj;
        }
        $obj = new $cache_class_name($obj);
        return $obj;
    }
}